﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AddIn.EA.Architecture.Validation.BusinessEntity;
//using AddIn.EA.Architecture.CatalogService.BusinessLogic;
using AddIn.EA.Framework;

namespace AddIn.EA.Architecture.Validation.BusinessLogic
{
    public class Validator : IValidator
    {
        private RepositoryManager repository { get; set; }
        private Package arquitetura { get; set; }

        public Validator(RepositoryManager repository, Package arquitetura)
        {
            this.repository = repository;
            this.arquitetura = arquitetura;
        }

        #region IValidator Members

        public ValidateErrorList Validate()
        {
            var errors = new ValidateErrorList();

            var sinacor = this.arquitetura.GetPackageByName("Sinacor");

            if (sinacor != null)
            {
                errors.AddRange(ValidateServico(sinacor));
                errors.AddRange(ValidateUI(sinacor));
            }
            else
                errors.AddError(this.arquitetura.Name, "Package Sinacor não encontrada");

            return errors;
        }

        #endregion

        private ValidateErrorList ValidateServico(Package sinacor)
        {
            var errors = new ValidateErrorList();

            var servico = sinacor.GetPackageByName("Servico");

            if (servico != null)
            {
                if (servico.Packages != null && servico.Packages.Count > 0)
                {
                    foreach (var modulo in servico.Packages)
                    {
                        if (modulo.Packages != null && modulo.Packages.Count > 0)
                        {
                            foreach (var submodulo in modulo.Packages)
                            {
                                var businessEntity = submodulo.GetPackageByName("BusinessEntity");
                                if (businessEntity != null)
                                {
                                    ;
                                }
                                else
                                    errors.AddError(submodulo.Name, "Package BusinessEntity não encontrada no submódulo");

                                var businessLogic = submodulo.GetPackageByName("BusinessLogic");
                                if (businessLogic != null)
                                {
                                    ;
                                }
                                else
                                    errors.AddError(submodulo.Name, "Package BusinessLogic não encontrada no submódulo");

                                var resourceAccess = submodulo.GetPackageByName("ResourceAccess");
                                if (resourceAccess != null)
                                {
                                    ;
                                }
                                else
                                    errors.AddError(submodulo.Name, "Package ResourceAccess não encontrada no submódulo");

                                var service = submodulo.GetPackageByName("Service");
                                if (service != null)
                                {
                                    IValidator serviceValidator = new ServiceValidator(this.repository, service);
                                    errors.AddRange(serviceValidator.Validate());
                                }
                                else
                                    errors.AddError(submodulo.Name, "Package Service não encontrada no submódulo");
                            }
                        }
                        else
                            errors.AddError(modulo.Name, "Package do submódulo não encontrada");
                    }
                }
                else
                    errors.AddError(servico.Name, "Package do módulo não encontrada");
            }
            else
                errors.AddError(sinacor.Name, "Package Servico não encontrada");

            return errors;
        }

        private ValidateErrorList ValidateUI(Package sinacor)
        {
            var errors = new ValidateErrorList();

            var ui = sinacor.GetPackageByName("UI");

            if (ui != null)
            {
                if (ui.Packages != null && ui.Packages.Count > 0)
                {
                    foreach (var modulo in ui.Packages)
                    {
                        if (modulo.Packages != null && modulo.Packages.Count > 0)
                        {
                            foreach (var submodulo in modulo.Packages)
                            {
                                var communication = submodulo.GetPackageByName("Communication");
                                if (communication != null)
                                {
                                    ;
                                }
                                else
                                    errors.AddError(submodulo.Name, "Package Communication não encontrada no submódulo");

                                var model = submodulo.GetPackageByName("Model");
                                if (model != null)
                                {
                                    ;
                                }
                                else
                                    errors.AddError(submodulo.Name, "Package Model não encontrada no submódulo");

                                var presenter = submodulo.GetPackageByName("Presenter");
                                if (presenter != null)
                                {
                                    ;
                                }
                                else
                                    errors.AddError(submodulo.Name, "Package Presenter não encontrada no submódulo");
                            }
                        }
                        else
                            errors.AddError(modulo.Name, "Package do submódulo não encontrada");
                    }
                }
                else
                    errors.AddError(ui.Name, "Package do módulo não encontrada");
            }
            else
                errors.AddError(sinacor.Name, "Package UI não encontrada");

            return errors;
        }

    }
}
